package com.itany.cloud.service;

import com.itany.cloud.util.ResponseResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/8/10 14:05
 * Version:1.0-SNAPSHOT
 * Description:
 */
// @FeignClient注解标注在该类上
// 表示该类通过调用指定的微服务实现当前类中的方法
// value属性:指定订阅的微服务是谁,其值是注册到注册中心中的某一个微服务
// 指定了微服务,实际上相当于访问了微服务所在的服务器的协议名://域名:端口
// 如果某一个方法需要访问具体的某一个资源,需要在方法上指定资源地址
// 此处接口的每一个方法均可以使用Handler中提供的注解进行访问
// 此处注解并不是指定访问当前资源的地址,而是表示访问哪一个地址的资源
@Service
//@FeignClient(value = "cloud-eureka-provider")
//@FeignClient(value = "cloud-eureka-provider",fallback = UserServiceFallback.class)
//@FeignClient(value = "cloud-zuul",fallback = UserServiceFallback.class)
@FeignClient(value = "cloud-zuul")
public interface UserService {

    // 由于此处并不是Handler方法
    // 因此,在Handler方法中的一切默认行为全部失效

    // 此处表示通过访问指定的微服务下指定的资源来实现当前接口的方法
    @GetMapping("/v1/userService/users")
    public ResponseResult findAll();

    // 此处注解参数默认为当前变量名,失效
    // 必须指定参数
    @GetMapping("/v1/userService/users/{id}")
    public ResponseResult findById(@PathVariable("id") Integer id);

    // 参数为对象时,默认解析对象中的所有属性,失效
    // 必须指定属性名
    // 参数没有任何注解所标注且参数是一个非对象,默认添加@RequestParam("key")注解,失效
    // 必须手动添加注解,指定参数名
    @PostMapping("/v1/userService/users")
    public ResponseResult addUser(@RequestParam("username") String username,@RequestParam("password") String password,@RequestParam("phone") String phone,@RequestParam("address") String address);

    @DeleteMapping("/v1/userService/users/{id}")
    public ResponseResult deleteUser(@PathVariable("id") Integer id);

    @PutMapping("/v1/userService/users")
    public ResponseResult modifyUser(@RequestParam("id") Integer id,@RequestParam("username") String username,@RequestParam("password") String password,@RequestParam("phone") String phone,@RequestParam("address") String address);
}
